package com.lagou.ipersistence.parsing;

import java.util.Properties;

/**
 * 根据表达式和Properties对象解析出来数据
 *
 * @author Yan Jiahong
 * Created on 2020/11/15
 */
public class PropertyParser {

    /**
     * 将一个具有开闭符包裹的表达式的值从Properties对象中解析出来
     * 其中表达式就是Properties对象中的key
     *
     * @param text      包含有开闭符号的表达式
     * @param variables key-value内容的Properties对象,
     * @return 根据表达式解析后的值(从Properties对象的value)
     */
    public static String parse(String text, Properties variables) {
        TokenHandler handler = new VariableTokenHandler(variables);
        GenericTokenParser parser = new GenericTokenParser("${", "}", handler);
        return parser.parse(text);
    }

    /**
     * 根据Properties对象中的标志(key)返回标志锁代表的值的处理器
     */
    private static class VariableTokenHandler implements TokenHandler {
        private final Properties variables;

        public VariableTokenHandler(Properties variables) {
            this.variables = variables;
        }

        @Override
        public String handle(String token) {
            if (variables.containsKey(token)) {
                return variables.getProperty(token);
            }
            return "${" + token + "}";
        }
    }
}
